package c08Java集合;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;

/**
 * 查看源代码发现，HashSet的元素是储存在HashMap的key集合里的！而TreeSet的元素是储存在TreeMap的key集合里的！
 * 加入到HashSet、HashMap中的元素必须同时实现equals与hashCode方法，
 * 保证equals判断两元素相等时hashCode方法的返回值也相等！因为HashMap内部使用一个Map.Entry数组储存元素，
 * hashCode相同的元素都会放到同一个Entry[hashCode]中！
 * 集合根据hashCode给元素找位置，再用equals方法判断在该位置里是否存在相同的元素：
 * 1、hashCode不同、equals返回true，两个元素将会保存在不同位置；
 * 2、hashCode相同、equals返回false更麻烦，该元素将会插入到该位置的Entry中，将会对性能造成不利影响！
 * <p>
 * 加入到TreeSet、TreeMap中的元素必须同时实现equals与compareTo方法，或传入一个实现Comparator接口的对象，
 * 保证元素相等时返回true和0！原理与上面的类似。
 *
 * @author 炜sama
 */
public class HashSet和HashMap和equals和hashCode {

	public static void main(String[] args) {
		HashSet hs = new HashSet();
		hs.add(new Equals(1));
		hs.add(new Equals(2));
		System.err.println(hs);

		HashMap hm = new HashMap();
		Equals e1 = new Equals(1);
		Equals e2 = new Equals(2);
		hm.put(e1, e1);
		hm.put(e2, e2);
		System.err.println(hm);
		System.err.println(hm.get(e1));
		System.err.println(hm.get(e2));

		HashSet hs2 = new HashSet();
		hs2.add(new Hash(1));
		hs2.add(new Hash(2));
		System.err.println(hs2);

		System.err.println("hs.equals(hs2): " + hs.equals(hs2));

		HashMap hm2 = new HashMap();
		Hash h1 = new Hash(1);
		Hash h2 = new Hash(2);
		Hash h3 = new Hash(2);
		hm2.put(h1, h1);
		hm2.put(h2, h2);
		System.err.println(hm2);
		System.err.println(hm2.get(h1));
		System.err.println(hm2.get(h2));
		System.err.println(hm2.get(h3));
	}

}

class Equals {
	private int i;

	public Equals(int i) {
		this.i = i;
	}

	@Override
	public boolean equals(Object obj) {
		return true;
	}

	@Override
	public String toString() {
		return "Equals:" + i + "-@" + hashCode();
	}
}

class Hash {
	private int i;

	public Hash(int i) {
		this.i = i;
	}

	@Override
	public int hashCode() {
		return 1;
	}

	@Override
	public String toString() {
		return "Hash:" + i + "-@" + hashCode();
	}
}